package com.elepant.thread;

/**
 * Created by Elephant
 * Date：2021/7/6.
 */
public class VolatileTest {

    /**现象：如果 flag 不加volatile关键字修饰，则程序永远不会退出，calc() 方法一直死循环
     * 主线程（main）中设置了 flag = true; 而 t1 线程在进行判断flag的时候拿到的仍然是false。
     * 那就是因为t1线程每次判断flag标记的时候是从它自己的“工作内存中”取值，而并非从主内存中取值！
     *
     * 这也是JVM为了提供性能而做的优化。那我们如何能让t1线程每次判断flag的时候都强制它去主内存中取值呢。这就是volatile关键字的作用
     *
     * 7、如何优雅的结束一个线程？
     * 7.1 volatile修饰的变量来判断退出条件
     * private volatile static running = true
          new Thread(() - {
              while(running){
               dosomething()
              }
          }).start();
     *
     * //想要结束线程的时候 直接赋值为 false;
     * running = false;
     */
    /*volatile*/ static long gloableCount = 0;
    static boolean  flag = false;

    public static void main(String[] args) throws InterruptedException {


        Thread t1 = new Thread(()->{
            calc();
        });
        t1.start();

        Thread.sleep(2000);
        flag = true;
        System.out.println("gloableCount:" + gloableCount);
    }

    private static void calc() {
        while (!flag){
            gloableCount++;
        }
        System.out.println(" calc over");
    }


}
